#include "wav_decoder.h"

// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
bool WavDecoder::init() {
    m_valid = true;
    return true;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
void WavDecoder::clear() {
    return;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
void WavDecoder::reset() {
    m_valid = false;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
bool WavDecoder::isValid() {
    return m_valid;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
int32_t WavDecoder::findSyncWord(uint8_t* buf, int32_t nBytes) {
    return 0;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
uint8_t WavDecoder::getChannels() {
    return m_channels;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
uint32_t WavDecoder::getSampleRate() {
    return m_sampleRate;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
uint32_t WavDecoder::getOutputSamples() {
    return m_validSamples;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
uint8_t WavDecoder::getBitsPerSample() {
    return m_bps;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
uint32_t WavDecoder::getBitRate() {
    return 0;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
uint32_t WavDecoder::getAudioDataStart() {
    return 0;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
uint32_t WavDecoder::getAudioFileDuration() {
    return 0;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
const char* WavDecoder::getStreamTitle() {
    return "";
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
const char* WavDecoder::whoIsIt() {
    return "WAV";
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
int32_t WavDecoder::decode(uint8_t* inbuf, int32_t* bytesLeft, int16_t* outbuf) {
    uint16_t frame = *bytesLeft;
    if (frame > 2048) frame = 2048;

    if (m_bps == 16) {
        memmove(outbuf, inbuf, frame);
        m_validSamples = frame / (2 * getChannels());
    } else if (m_bps == 8) {
        int channels = getChannels(); // e.g. 1 or 2
        int samples  = frame / channels; // Number of sample frames

        if (channels == 1) {
            // MONO
            for (int i = 0; i < samples; i++) {
                outbuf[i] = (static_cast<int16_t>(inbuf[i]) - 128) << 8;
            }
        } else if (channels == 2) {
            // STEREO (interleaved L/R)
            for (int i = 0; i < samples; i++) {
                uint8_t l = inbuf[i * 2 + 0];
                uint8_t r = inbuf[i * 2 + 1];
                outbuf[i * 2 + 0] = (static_cast<int16_t>(l) - 128) << 8;
                outbuf[i * 2 + 1] = (static_cast<int16_t>(r) - 128) << 8;
            }
        } else {
            // other channel numbers optional
            return -2;
        }

        m_validSamples = samples;
    } else {
        // Unsupported bits per sample
        m_validSamples = 0;
        return -1;
    }

    *bytesLeft -= frame;
    return 0;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
void WavDecoder::setRawBlockParams(uint8_t channels, uint32_t sampleRate, uint8_t BPS, uint32_t tsis, uint32_t AuDaLength) {
    m_channels = channels;
    m_sampleRate = sampleRate;
    m_bps = BPS;
    return;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
std::vector<uint32_t> WavDecoder::getMetadataBlockPicture() {
    std::vector<uint32_t> res = {};
    return res;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
const char* WavDecoder::arg1() {
    return "";
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
const char* WavDecoder::arg2() {
    return "";
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
int32_t WavDecoder::val1() {
    return 0;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
int32_t WavDecoder::val2() {
    return 0;
}
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
